/* 
 * File:   Base_SearchEnginer.h
 * Author: vicror
 *
 * Created on October 24, 2011, 1:03 AM
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files
 * (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge,
 * publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef BASE_SEARCHENGINER_H
#define	BASE_SEARCHENGINER_H

#include "basetype.h"

namespace SearchEnginer {
    class Vocabluary;

    class Base_SearchEnginer {
        friend class Vocabluary;
    public:
        Base_SearchEnginer();
        Base_SearchEnginer(const Base_SearchEnginer& orig);
        virtual ~Base_SearchEnginer();

        /**
         * @brief Синхронизирует поисковую машину с другой
         * @param orig - внешняя поисковая машина
         * @return Нет возврашаемых параметров
         */
        void link(const Base_SearchEnginer& orig);

        /**
         * @brief Удаляет ссылку на словарь.
         * @param Нет входных параметров.
         * @return Нет возврашаемого значения.
         *
         * Автоматически вызывается виртуальная функция OnClear, для дальнейшей
         * очистки словаря в дочерних классах. Иницилизируется новый пустой
         * словарь.
         */
        void unLink(void);

        /**
         * @brief Добавляет слово в словарь
         * @param orig - слово
         * @return Если слово добавилось в словарь, возрашается true,
         * иначе false
         */
        bool append(const string& orig);

        /**
         * @brief Добавляет слова из словаря другой Поисковой машины.
         * @param orig - Поисковая машина источник
         * @return Если добавилось хоть одно слово,
         */
        bool append(const Base_SearchEnginer& orig);

        /**
         * @brief Возврашает слова, соответсвуюшие шаблону.
         * @param orig - слово
         * @return Возврашает список слов.
         */
        ListString hasWord(const string& orig) const;

        /**
         * @brief Возврашает указатель на внутрений словарь.
         * @param Нет параметров вызова
         * @return Нет возврашаемого значения.
         */
        inline Vocabluary *getVocabluary(void) {return vocabluary;};

        /**
         * @brief Выводит в поток содержимое словаря.
         * @param out - поток ввывода.
         * @param orig - Поисковая машина.
         * @return возврашает поток ввывода.
         *
         * Выводит в поток содержимое словаря. Файл словаря предваряется меткой
         * SearchEnginerVer1.0
         */
        friend std::ostream& operator<< (std::ostream& out, const Base_SearchEnginer &orig);

        /**
         * @brief Загружает из потока словарь.
         * @param out - поток ввода.
         * @param orig - Поисковая мащина.
         * @return Возврашает поток ввода.
         *
         * Загружает из потока словарь. Передача должна предварятся меткой
         * SearchEnginerVer1.0. Словарь перед загрузкой не очишается. Т.е.
         * каждая загрузка дополняет словарь.
         */
        friend std::istream& operator>> (std::istream& is, Base_SearchEnginer& orig);


//------------------  Методы должны перекрываться в дочерних классах. ----------
        /**
         * @brief Ишет слово в словаре.
         * @param orig - слово
         * @return Возрашает индексы, для которых слово соответсвует поиску.
         */
        virtual ListIndex hasWordByID(const string& orig) const;

    protected:
        /**
         * @brief Добавление в словарь слова.
         * @param orig - слово
         * @param index - индекс в словаре
         *
         * При добавлении слова в словаре, данная функция вызывается
         * автоматически словарем. Нельзя ее применять напрямую.
         */
        virtual void syncWord(const string& orig, Index index);

        /**
         * @brief Функция предназначена для полной очистки словаря в дочерних
         * классах.
         * @param Нет входных параметров.
         * @return Нет возврашаемого значения.
         */
        virtual void OnClear(void);
        
        /**
         * @brief Функция предназначена для синхронизации словаря дочерними 
         * классами
         * @param Нет входных параметров.
         * @return Нет возврашаемого значения.
         *
         * Если нужны дополнительные действия по синхронизации словаря в
         * дочернем классе, нужно перекрыть данную функцию.
         */
        virtual void OnSync(void);
//------------------------------------------------------------------------------
        /**
         * @brief заменяет внутрений словарь.
         * @param orig - указатель на внешний словарь
         * @return Нет возврашаемого значения.
         *
         * Синхронизирует словарь со внутреним словарем. Вызывает метод OnSync
         * для дополнительных действий по синхронизвции дочерних классов.
         */
        void syncVocabluary(Vocabluary *orig);

        /**
         * @brief Завершаюшая стадия разсинхронизации линков
         * @param orig - внешняя поисковая машина
         * @return Нет возврашаемых параметров
         */
        void syncUnLink();




    private:

        Vocabluary *vocabluary;

    };
}
#endif	/* BASE_SEARCHENGINER_H */

